#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <wait.h>
#include "sem.c"
#include "shm.c"

#define N_NIM	5

void nim( int i ) ;

int main(int argc, char **argv)
{
	int i;
	int sem_id;
	int nfilhos;

	if( argc != 2 )
	{	printf( "uso %s num_filhos\n", argv[0] );
		exit(1);
	}

	nfilhos = atoi(argv[1]);

	sem_id = createSem(1);

	for( i = 0; i < nfilhos; i++ )
		if( fork() == 0 )
		{	
			//decrementa-se o valor do semáforo, para bloquear os restantes processos enquanto este está em execução
			P(sem_id);
			nim(i);
			//depois de acabar a impressão das mensagens, incrementa-se novamente o semáforo e este fica aberto
			V(sem_id);
			exit(0);
		}

	for( i = 0; i < nfilhos; i++ )
		wait(NULL);

	printf( "fim!\n" );

	//apagar semaforo
	deleteSem(sem_id);
	return 0;
}

void nim(int i)
{
	int pid = getpid();
	int n;

	for( n = 1; n <= N_NIM; n++ )
	{
		printf("Filho %d - <%d> Mensagem %d\n", i, pid, n );
	}
}



